import router from './router'
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress' // 进度条组件
import 'nprogress/nprogress.css' // 进度条样式
// 导入我们的动态路由数组集合
import { asyncRoutes } from '@/router/index'

NProgress.configure({ showSpinner: false }) // 进度条组件配置

const permissionsList = ['/login','/404'] // 路由地址需要放行白名单
// 路由前置守卫
// to:到哪里去
//from:从哪里来
//next:只有执行了next,才可以跳转
router.beforeEach(async (to, from, next) => {
  //开启进度条
  NProgress.start()
  //从 @/store/getters.js暴露出来的方法获取token
  //如果存在token
  if(store.getters.token){
    //判断我要去的页面是不是登录页
    if(to.path === '/login'){
      //跳转到主页，不需要去登录页面了
      next('/')//中转到主页
      // next（地址）并没有执行后置守卫,这里需要手动关闭进度条
      NProgress.done()
    }else{
      // 判断是否获取过用户信息
      //如果用户id不存在
      //从 @/store/getters.js暴露出来的方法获取userId
      if(!store.getters.userId){
        //vuex中没有用户id的情况下，代表没有去通过axios获取用户信息
        const result = await store.dispatch('user/getUserInfo')
        //console.log(result); 获取用户信息
        const roles = result.roles;//角色集合
        //roles.map(role=>{})
        //console.log(result.roles);
        //const menus = result.menus;//权限集合
        const menusCodes = result.menus.map(item=>item.code)
        //console.log(menusCodes);
        //用返回的权限menusCode数组去和asyncRoutes数组中的路由进行匹配
        //asyncRoutes数组是固定的8个
        //menusCode数组是不确定的，根据用户权限不同，menusCode数组中的值不同
        //使用asyncRoutes总的路由去和menusCode数组中的值进行匹配，匹配成功后，返回一个数组
        const filterRoles =  asyncRoutes.filter(item=>menusCodes.includes(item.name))
        //console.log(filterRoles);
        //将筛选出来的路由添加到vuex
        store.commit('user/setRoutes',filterRoles)
        //将匹配成功的路由数组，添加到路由实例中
        //router.addRoutes()方法，添加路由     404必须放在动态路由的最后面
        router.addRoutes([...filterRoles,{ path: '*', redirect: '/404', hidden: true }])
        //router添加动态路由之后，需要转发一下
        next(to.path)//目的是让路由拥有信息，router的已知缺陷

      }else{
        //如果不去获取用户信息，直接放行
        next()//放行
      }
    }
  }else{
    // 没有token，判断是否在白名单中，如果在白名单中，直接放行
    if (permissionsList.includes(to.path)) {
      next()
    } else {
      // 不在白名单中，跳转到登录页
      next('/login')
      NProgress.done()
    }
  }
})
// 后置守卫
router.afterEach(() => {
  // 关闭进度条
  NProgress.done()
})
